/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import clases.Articulo;
import clases.Asignatura;
import clases.Autor;
import clases.Persona;
import clases.Seccion;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.struts.upload.FormFile;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Rafa
 */
public class DAO_Autor {

    Session sesion = null;

    public DAO_Autor() {
        this.sesion = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    public List<Autor> consultaAutores(boolean iniciar) {
        List<Autor> listaAutores = new ArrayList();
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se realiza la consulta
            Query q = sesion.createQuery("from Autor");

            //Se recoge el resultado de la consulta
            listaAutores = (List<Autor>) q.list();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return listaAutores;
    }

    public Autor consultaAutorPorId(String idAutor, boolean iniciar) {
        Autor autor = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se hace la consulta
            Query query = sesion.createQuery("from Autor where idAutor = '" + idAutor + "'");
        //query.setParameter("fk", fk_Persona);

            //Se recoge el resultado de la consulta
            autor = (Autor) query.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return autor;
    }

    public Autor consultaAutorPorEmail(String email, boolean iniciar) {
        Autor autor = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se recoge la persona con el emai que se ha pasado por parametros
            DAO_Persona d = new DAO_Persona();
            Persona persona = d.consultaPersona(email, true);
            int fk_Persona = persona.getIdPersona();

            //Se hace la consulta
            Query query = sesion.createQuery("from Autor where fk_Persona = '" + fk_Persona + "'");
        //query.setParameter("fk", fk_Persona);

            //Se recoge el resultado de la consulta
            autor = (Autor) query.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return autor;
    }

    //Se retorna el autor
    public Autor insertaAutor(String keywords, String nombre, String apellidos, String email, String titulo,
            String idSeccion, String idAsignatura, String tipo, String tema, FormFile PDF, String ubicacionWebInf, boolean iniciar) {
        Autor autor = null;
        try {

            //Se obtiene la asignatura y la seccion
            Seccion seccion = null;
            Asignatura asignatura = null;
            DAO_Seccion daoSeccion = new DAO_Seccion();
            DAO_Asignatura daoAsignatura = new DAO_Asignatura();
            if (idSeccion.isEmpty() == false) {
                seccion = daoSeccion.consultaSeccionPorId(Integer.parseInt(idSeccion), iniciar);
                asignatura = daoAsignatura.consultaAsignatura(Constantes.getNO_ASIGNATURA(), iniciar);
            } else {
                asignatura = daoAsignatura.consultaAsignaturaPorId(idAsignatura, iniciar);
                seccion = daoSeccion.consultaSeccion(Constantes.getNO_SECCION(), iniciar);
            }

            //Se crea la persona que tendra asociada el autor
            DAO_Persona d = new DAO_Persona();
            String descripcionPersona = "Autor";
            Persona persona = d.insertaPersona(nombre, apellidos, email, descripcionPersona, true);

            /*Se crea el articulo
             (Seccion seccion, Asignatura asignatura, String titulo, String estado, boolean destacado,
             int votacion, String tema)
             */
            DAO_Articulo dao_articulo = new DAO_Articulo();
            Articulo articulo = dao_articulo.insertaArticulo(seccion, keywords, asignatura, titulo, tema, PDF, ubicacionWebInf, true);

            //Se crea el conjunto de articulos y se le añade
            Set<Articulo> conjuntoArticulos = new LinkedHashSet<>();
            conjuntoArticulos.add(articulo);

            //Se crea el autor
            autor = new Autor(persona, tipo, conjuntoArticulos);

            //Se crea el conjunto de autores y se le añade
            Set<Autor> conjuntoAutores = new LinkedHashSet<>();
            conjuntoAutores.add(autor);

            //Se le asocia el autor al articulo
            articulo.setAutors(conjuntoAutores);

            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();
            /*Se hace un saveOrUpdate para que el articulo se le asocie el autor, ya que
             previavente en 'insertarArticulo' se ha hecho un "save"*/
            sesion.saveOrUpdate(articulo);

            sesion.save(autor);
            sesion.getTransaction().commit();
        } catch (Exception e) {
            if (sesion.getTransaction() != null) {
                sesion.getTransaction().rollback();
            }
            e.printStackTrace();

        }

        return autor;
    }

    public boolean modificarAutor(String idAutor, String email, boolean iniciar) {
        boolean correcto = false;
        try {
            Autor autor = null;
            if (iniciar) {
                sesion.beginTransaction();
                autor = consultaAutorPorId(idAutor, iniciar);
            } else {
                autor = consultaAutorPorId(idAutor, iniciar);
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            autor.getPersona().setEmail(email);

            sesion.saveOrUpdate(autor);
            sesion.getTransaction().commit();
            correcto = true;
        } catch (Exception e) {
            if (sesion.getTransaction() != null) {
                sesion.getTransaction().rollback();
            }
            e.printStackTrace();
        }

        return correcto;
    }

    /**
     * Este metodo es por si alguna vez se quiere dar la opcion de modificar el
     * nombre y apellidos de un autor
     *
     * @param idAutor
     * @param descAutor
     * @param nombre
     * @param apellidos
     * @param email
     * @return
     */
    public boolean modificarAutorComplejo(String idAutor, String descAutor, String nombre, String apellidos, String email, boolean iniciar) {
        boolean correcto = false;
        try {
            Autor autor = null;
            if (iniciar) {
                sesion.beginTransaction();
                autor = consultaAutorPorId(idAutor, false);
            } else {
                autor = consultaAutorPorId(idAutor, true);
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            autor.getPersona().setNombre(nombre);
            autor.getPersona().setApellidos(apellidos);
            autor.getPersona().setEmail(email);
            autor.getPersona().setDescripcion(descAutor);

            sesion.saveOrUpdate(autor);
            sesion.getTransaction().commit();
            correcto = true;
        } catch (Exception e) {
            if (sesion.getTransaction() != null) {
                sesion.getTransaction().rollback();
            }
            e.printStackTrace();
        }

        return correcto;
    }

    public boolean eliminaAutor(String idAutor, boolean iniciar) {
        boolean correcto = false;
        try {
            if (iniciar) {
                sesion.beginTransaction();
                sesion.delete(consultaAutorPorId(idAutor, false));
            } else {
                sesion.delete(consultaAutorPorId(idAutor, true));
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            sesion.getTransaction().commit();
            correcto = true;
        } catch (Exception e) {
            if (sesion.getTransaction() != null) {
                sesion.getTransaction().rollback();
            }
            e.printStackTrace();

        }
        return correcto;
    }

    public void insertarArticuloAutor(String idAutor, Articulo articulo, boolean iniciar) {
        try {
            //Se consulta el autor
            Autor autor = null;
            if (iniciar) {
                sesion.beginTransaction();
                autor = consultaAutorPorId(idAutor, false);
            } else {
                autor = consultaAutorPorId(idAutor, true);
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se cogen sus articulos
            Set<Articulo> conjuntoArticulos = autor.getArticulos();

            //Se le añade el nuevo articulo
            conjuntoArticulos.add(articulo);

            //Se guarda de nuevo el autor
            sesion.saveOrUpdate(autor);
            sesion.getTransaction().commit();
        } catch (Exception e) {
            if (sesion.getTransaction() != null) {
                sesion.getTransaction().rollback();
            }
            e.printStackTrace();

        }
    }

    public boolean compruebaEmail(String email) {
        // Compiles the given regular expression into a pattern.
        Pattern pattern = Pattern.compile(Constantes.getPATTERN_EMAIL());

        // Match the given input against this pattern
        Matcher matcher = pattern.matcher(email);
        return matcher.matches();
    }

}
